#include <iostream>
#include <stdarg.h>
//c++中的可变长参数
/**
 * 函数的调用，是一个压栈，保存，跳转的过程。简单的流程描述如下：

把参数从右到左依次压入栈；
调用call指令，把下一条要执行的指令的地址作为返回地址入栈；（被调用函数执行完后会回到该地址继续执行）
当前的ebp（基址指针）入栈保存，然后把当前esp（栈顶指针）赋给ebp作为新函数栈帧的基址；
执行被调用函数，局部变量等入栈；
返回值放入eax，leave，ebp赋给esp，esp所存的地址赋给ebp；（这里可能需要拷贝临时返回对象）
从返回地址开始继续执行；（把返回地址所存的地址给eip）
具体实现原理查看
https://www.cnblogs.com/kevonyang/p/5932059.html
 */
int sum(int count,...)
{
    //函数功能，获取后面列表中的和
    va_list args;
    va_start(args, count);
    for (int i = 0; i < count; ++i)
    {
        int arg = va_arg(args, int);
        printf("arg %d = %d", i, arg);
    }
    va_end(args);
    return 12;
}
using namespace std;
int main(int argc, char **args)
{
    cout<<sum(4,2,5,6,8);
    return 0;
}